package com.gadgets.cm05.statistic;

import com.gadgets.cm05.common.dto.MathList;
import com.gadgets.framework.common.exception.GadgetsValidateException;
import com.gadgets.framework.common.util.MathBasicUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.math3.stat.StatUtils;
import org.apache.commons.math3.util.FastMath;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 功能说明：
 * 著作者：修峻青
 * 创建日期：2023-01-07
 */
public class VarianceUtils {

    /**
     * 样本方差计算
     * @param itemList  样本
     * @param scale     数据精度
     * @return          样本方差值
     */
    public static BigDecimal varianceForItem(MathList<BigDecimal> itemList, int scale){
        if(CollectionUtils.isEmpty(itemList)){
            throw new GadgetsValidateException("样本不能为空");
        }
        double[] doubles = MathBasicUtil.translateListToDoubleArray(itemList, scale);
        return new BigDecimal(StatUtils.variance(doubles)).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 样本方差计算
     * 默认小数点后6位精度
     * @param itemList  样本
     * @return          样本方差值
     */
    public static BigDecimal varianceForItem(MathList<BigDecimal> itemList){
        return varianceForItem(itemList, 6);
    }

    /**
     * 样本标准计算
     * @param itemList  样本
     * @param scale     数据精度
     * @return          样本方差值
     */
    public static BigDecimal devisionForItem(MathList<BigDecimal> itemList, int scale){
        if(CollectionUtils.isEmpty(itemList)){
            throw new GadgetsValidateException("样本不能为空");
        }
        double[] doubles = MathBasicUtil.translateListToDoubleArray(itemList, scale);
        return new BigDecimal(FastMath.sqrt(StatUtils.variance(doubles))).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 样本标准计算
     * 默认小数点后6位精度
     * @param itemList  样本
     * @return          样本方差值
     */
    public static BigDecimal devisionForItem(MathList<BigDecimal> itemList){
        return devisionForItem(itemList, 6);
    }


}
